import type { ToolWithHandler } from '~/interfaces/MCPServer.js';
import { MCPOutputAdapter } from '~/utils/MCPOutputAdapter.js';

const outputAdapter = new MCPOutputAdapter();

/**
 * Learn 工具 - 专业资源学习器
 * 
 * PromptX资源管理体系的统一学习入口
 */
export const learnTool: ToolWithHandler = {
  name: 'learn',
  description: `🧠 [专业资源学习器] PromptX资源管理体系的统一学习入口
通过标准化协议体系加载各类专业资源，是AI获取专业能力和理解工具使用的核心通道。

何时使用此工具:
- 用户要求使用某个工具但你不了解其用法
- 需要获取特定领域的专业思维模式和执行技能
- 想要了解某个角色的完整定义和能力边界
- 需要查看工具的使用手册和参数说明
- 学习项目特定的资源和配置信息
- 获取最新的专业知识和最佳实践
- 理解复杂概念前需要学习相关基础知识

核心学习能力:
- 支持12种标准协议的资源加载和解析
- 智能识别资源类型并选择合适的加载策略
- 保持manual文档的原始格式不进行语义渲染
- 支持跨项目资源访问和继承机制
- 自动处理资源间的依赖关系
- 提供结构化的学习内容展示
- 资源内容的实时加载和更新

使用说明:
- 确保资源路径或ID的正确性
- 对于工具使用必须先学习manual再考虑使用tool

支持的资源协议:
- @role://角色ID - 完整角色定义
- @thought://资源ID - 专业思维模式
- @execution://资源ID - 执行技能实践
- @knowledge://资源ID - 领域专业知识
- @manual://工具名 - 工具使用手册（必须真实存在）
- @tool://工具名 - 工具源代码
- @package://包名 - 工具包资源
- @project://路径 - 项目特定资源
- @file://路径 - 文件系统资源
- @prompt://ID - 提示词模板
- @user://资源 - 用户自定义资源
- @resource://ID - 通用资源引用

重要提醒:
- 只能学习真实存在的资源，绝不虚构
- 资源不存在时会返回错误，不要猜测
- 工具manual必须先存在才能学习使用

你应该:
1. 看到工具相关需求时立即学习对应的@manual://工具名
2. 在不确定资源内容时主动使用learn查看
3. 遵循"学习→理解→使用"的标准流程
4. 为用户推荐相关的学习资源
5. 记住已学习的内容避免重复学习
6. 识别资源间的关联并建议深入学习
7. 在激活角色后学习其依赖的所有资源
8. 将学习到的知识立即应用到当前任务中`,
  inputSchema: {
    type: 'object',
    properties: {
      resource: {
        type: 'string',
        description: '资源URL，支持格式：thought://creativity, execution://best-practice, knowledge://scrum'
      }
    },
    required: ['resource']
  },
  handler: async (args: { resource: string }) => {
    // 动态导入 @promptx/core
    const core = await import('@promptx/core');
    const coreExports = core.default || core;
    
    // 获取 cli 对象
    const cli = (coreExports as any).cli || (coreExports as any).pouch?.cli;
    
    if (!cli || !cli.execute) {
      throw new Error('CLI not available in @promptx/core');
    }
    
    // 执行 learn 命令
    const result = await cli.execute('learn', [args.resource]);
    
    // 使用 OutputAdapter 格式化输出
    return outputAdapter.convertToMCPFormat(result);
  }
};